import axios from 'axios'
import router from '../router'
import store from '../store';
import { message } from 'ant-design-vue'

/** 
 * 提示函数 
 * 禁止点击蒙层、显示一秒后关闭
 */
const tip = msg => {    
	message.error(msg);
}


/** 
 * 跳转登录页
 * 携带当前页面路由，以期在登录页面完成登录后返回当前页面
 */
const toLogin = () => {
	router.replace({
		path: '/login',        
		query: {
			redirect: router.currentRoute.fullPath
		}
	});
}


/** 
 * 请求失败后的错误统一处理 
 * @param {Number} status 请求失败的状态码
 */
// const errorHandle = (status, other) => {
const errorHandle = (status) => {
	// 状态码判断
	switch (status) {
		// 401: 未登录状态，跳转登录页
		case 401:
			toLogin();
			break;
		// 404请求不存在
		case 404:
			tip('请求的资源不存在'); 
			break;
		/*default:
			tip(other);  */ 
	}
}


// 创建axios实例
var instance = axios.create({timeout: 1000 * 600});


/** 
 * 请求拦截器 
 * 每次请求前，如果存在token则在请求头中携带token 
 */ 
instance.interceptors.request.use(    
	config => {        
		// 登录流程控制中，根据本地是否存在token判断用户的登录情况        
		// 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token        
		// 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码        
		// 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。        
		//const token = store.state.account.token; 
		//token && (config.headers.Authorization = token);        
		return config;
	},    
	error => Promise.error(error)
)


// 响应拦截器
instance.interceptors.response.use(    
	// 请求成功
	res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),    
	// 请求失败
	error => {
		const { response } = error;
		if (response) {
			// 请求已发出，但是不在2xx的范围 
			errorHandle(response.status, response.data.message);
			return Promise.reject(response);
		}
	}
);

export default instance;